#include <ESP8266WiFi.h> //knihovna pro praci s WiFi
#include <Phant.h> //knihovna Phant

const char WiFiSSID[] = "nazev-wifi";
const char WiFiPSK[] = "heslo-wifi";

const int LED_PIN = 5;
const int ANALOG_PIN = A0; //jediny analogovy pin
const int DIGITAL_PIN = 12; //digitalni pin s tlacitkem

//nastaveni pripojeni k Phant serveru
const char PhantHost[] = "data.sparkfun.com";
const char PublicKey[] = "wpvZ9pE1qbFJAjaGd3bn";
const char PrivateKey[] = "wzeB1z0xWNt1YJX27xdg";

const unsigned long postRate = 30000;
unsigned long lastPost = 0;

void setup(){
    initHardware();
    connectWiFi();
    digitalWrite(LED_PIN, HIGH);
}

void loop(){
    if (lastPost + postRate <= millis())    {
        if (postToPhant()){
            lastPost = millis();
        }
        else{
            delay(100);
        }
    }
}

void connectWiFi(){
    byte ledStatus = LOW;

    WiFi.mode(WIFI_STA); //nastaveni WiFi
    WiFi.begin(WiFiSSID, WiFiPSK); //pripojeni k WiFi

    while (WiFi.status() != WL_CONNECTED){ //dokud se nepovede pripojit
        digitalWrite(LED_PIN, ledStatus); // Write LED high/low
        ledStatus = (ledStatus == HIGH) ? LOW : HIGH;
        delay(100);
    }
}

void initHardware(){
    Serial.begin(9600);
    pinMode(DIGITAL_PIN, INPUT_PULLUP);
    pinMode(LED_PIN, OUTPUT);
    digitalWrite(LED_PIN, LOW);
}

int postToPhant(){
    digitalWrite(LED_PIN, HIGH);

    Phant phant(PhantHost, PublicKey, PrivateKey); //vytvoreni objektu phant
    
    uint8_t mac[WL_MAC_ADDR_LENGTH];
    WiFi.macAddress(mac);
    String macID = String(mac[WL_MAC_ADDR_LENGTH - 2], HEX) + String(mac[WL_MAC_ADDR_LENGTH - 1], HEX);
    
    macID.toUpperCase();
    String postedID = "Thing-" + macID;

    phant.add("id", postedID);
    phant.add("analog", analogRead(ANALOG_PIN));
    phant.add("digital", digitalRead(DIGITAL_PIN));
    phant.add("time", millis());

    WiFiClient client;
    const int httpPort = 80;
    if (!client.connect(PhantHost, httpPort)){
        return 0;
    }
    client.print(phant.post());

    while (client.available()) {
        String line = client.readStringUntil('\r');
    }

    digitalWrite(LED_PIN, LOW);

    return 1; // Return success
}